package bomberman.modelo.armas;

import java.util.HashMap;
import java.util.Iterator;

import org.jdom2.Element;

import bomberman.modelo.IContenible;
import bomberman.modelo.mapa.Casillero;
import bomberman.modelo.mapa.Direccion;
import fiuba.algo3.titiritero.modelo.ObjetoPosicionable;

public abstract class Bomba implements IContenible, ObjetoPosicionable {
  private int         destruccion;
  private int         radio;
  protected Casillero ubicacion;
  
  public Bomba(int unaDestruccion, int unRadio, Casillero unaUbicacion) {
    this.destruccion = unaDestruccion;
    this.radio = unRadio;
    this.ubicacion = unaUbicacion;
  }
  
  protected void setUbicacion(Casillero nuevaUbicacion) {
    this.ubicacion = nuevaUbicacion;
  }
  
  public int getDestruccion() {
    return this.destruccion;
  }
  
  public int getRadio() {
    return this.radio;
  }
  
  public Casillero getUbicacion() {
    return this.ubicacion;
  }
  
  @Override
  public boolean esBalisticamentePermeable() {
    return true;
  }
  
  protected HashMap<Direccion, OndaExpansiva> explotar() {
    this.desaparecer();
    return this.producirOndas();
  }
  
  protected HashMap<Direccion, OndaExpansiva> producirOndas() {
    HashMap<Direccion, OndaExpansiva> ondasExpansivas =
      new HashMap<Direccion, OndaExpansiva>();
    final int unaDestruccion = this.getDestruccion();
    final int unRadio = this.getRadio();
    final Direccion[] direcciones =
      {Direccion.NOROESTE, Direccion.NORTE, Direccion.NORESTE, Direccion.OESTE,
        Direccion.ESTE, Direccion.SUROESTE, Direccion.SUR, Direccion.SURESTE};
    final int cantidadDirecciones = direcciones.length;
    for (int contador = 0; contador < cantidadDirecciones; contador++) {
      ondasExpansivas.put(direcciones[contador], new OndaExpansiva(
        unaDestruccion, unRadio, direcciones[contador]));
    }
    return ondasExpansivas;
  }
  
  protected void procesarExplosion(
    HashMap<Direccion, OndaExpansiva> ondasExpansivas) {
    Iterator<Direccion> iteradorDirecciones =
      ondasExpansivas.keySet().iterator();
    while (iteradorDirecciones.hasNext()) {
      Direccion direccion = iteradorDirecciones.next();
      Casillero proxCasillero = (this.getUbicacion()).getVecino(direccion);
      if (proxCasillero != null) {
        proxCasillero.recibirImpacto(ondasExpansivas.get(direccion));
      }
    }
  }
  
  protected void desaparecer() {
    this.ubicacion.setContenidoBajo(null);
  }
  
  @Override
  public int getX() {
    return (this.ubicacion.getPosicion().getHorizontal());
  }
  
  @Override
  public int getY() {
    return (this.ubicacion.getPosicion().getVertical());
  }
  
  protected Element serializar(Element unElemento) {
	unElemento.setAttribute("Destruccion",String.valueOf(this.getDestruccion()));
	unElemento.setAttribute("Radio",String.valueOf(this.getRadio()));
	unElemento.setContent(this.getUbicacion().serializarUbicacion());
	return unElemento;
  }
}
